package Utils;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

/**
 * Clase que gestiona las conexiones con los servidores.
 * 
 * @author Alejandro Gudiña Gil
 * @author Jordi Parrón Granados
 * @author Victor Tello Ruiz
 */
public class Conexion extends Thread {

	private String strUrl;
	private URL url;
	private URLConnection urlCon;
	private GestionUrls gest;
	private boolean withoutTags = false;
	private boolean inZip = false;
	private boolean inGZip = false;

	/**
	 * Constructor por defecto
	 */
	public Conexion() {
	}

	/**
	 * Constructor para crear una conexión a una URL
	 * 
	 * @param _url
	 * @param _withoutTags
	 * @param _zip
	 * @param _gzip
	 * 
	 * @exception Exception
	 */
	public Conexion(String _url, boolean _withoutTags, boolean _zip,
			boolean _gzip) {
		this.strUrl = _url;
		this.withoutTags = _withoutTags;
		this.inZip = _zip;
		this.inGZip = _gzip;
		gest = new GestionUrls();
		try {
			url = new URL(_url);
		} catch (Exception e) {
			System.out.println("Error al crear la conexión: " + _url);
		}
	}

	/**
	 * Función para abrir la conexión a una URL
	 * @exception Exception
	 */
	public void run() {
		try {
			urlCon = url.openConnection();
			System.out.println("Tipo de Archivo: " + urlCon.getContentType()); // nos
			// dice
			// el
			// tipo
			// de
			// archivo
			saveContentUrl();
		} catch (Exception e) {
			System.out.println("Error al abrir la conexión: " + this.strUrl);
		}
	}

	/**
	 * Función que llama a la clase {@link GestionUrls} guardar los contenidos
	 * de la página según los parametros introducidos por el usuario.
	 * 
	 * @throws IOException
	 */
	public void saveContentUrl() throws IOException {
		try {
			InputStream is = urlCon.getInputStream();
			if (!withoutTags && !inZip && !inGZip) // Nada
				gest.saveUrlContent(is, url);
			else if (withoutTags && !inZip && !inGZip) // -a
				gest.saveUrlContentWithoutTags(is, url);
			else if (withoutTags && inZip && !inGZip) // -a -z
				gest.saveUrlContentWithoutTagsOnZip(is, url);
			else if (withoutTags && !inZip && inGZip)// -a -gz
				gest.saveUrlContentWithoutTagsOnGZip(is, url);
			else if (!withoutTags && inZip && !inGZip)// -z
				gest.saveUrlContentOnZip(is, url);
			else if (!withoutTags && !inZip && inGZip)// -gz
				gest.saveUrlContentOnGZip(is, url);
			else if (withoutTags && inZip && inGZip)// -a -z -gz
				gest.saveUrlContentWithoutTagsOnZipAndGZip(is, url);
			else if (!withoutTags && inZip && inGZip) // -z -gz
				gest.saveUrlContentOnZipAndGzip(is, url);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * Getter del atributo strUrl que contiene la dirección URL.
	 * 
	 * @return String
	 */
	public String getStrUrl() {
		return strUrl;
	}

	/**
	 * Setter del atributo strUrl que contiene la dirección URL.
	 * @param url
	 */
	public void setStrUrl(String url) {
		this.strUrl = url;
	}
}
